package subraSoft.fenix.model.authentication.service.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;

import subraSoft.centaurus.model.cobj.CenDefaultCObj;
import subraSoft.centaurus.model.domain.CenDefaultDO;
import subraSoft.centaurus.model.service.CenIABMService;
import subraSoft.centaurus.model.service.CenIPaginableService;
import subraSoft.centaurus.model.service.impl.CenDefaultServiceImpl;
import subraSoft.fenix.model.authentication.cobj.FenObjSecCObj;
import subraSoft.fenix.model.authentication.cobj.FenPerfilCObj;
import subraSoft.fenix.model.authentication.domain.FenObjSecDO;
import subraSoft.fenix.model.authentication.domain.FenPerfilDO;
import subraSoft.fenix.model.authentication.service.FenObjSecService;
import subraSoft.fenix.model.authentication.service.FenPerfilService;
import subraSoft.fenix.model.cliente.domain.FenClienteDO;

public class FenPerfilServiceImpl extends CenDefaultServiceImpl 
	implements FenPerfilService, CenIABMService, CenIPaginableService {

	public String saveOrUpdate(CenDefaultCObj data)
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		FenPerfilCObj cObj = (FenPerfilCObj)data;
		FenPerfilDO perfilDO;
		
		perfilDO = (FenPerfilDO) session.get(FenPerfilDO.class, (String)data.getId());
		if(perfilDO == null)
		{
			perfilDO = new FenPerfilDO();
			perfilDO.setId((String) cObj.getId());
		}
		
		perfilDO.setDescripcion((String) cObj.getDescripcion());
		
		
		// UPDATE DE LAS RELACIONES CON OBJ DE SEGURIDAD TODO
		{
			List<FenObjSecDO> list = new ArrayList<FenObjSecDO>();
			for (FenObjSecCObj objSeg : cObj.getObjSecs()) 
			{
				FenObjSecDO objSecDO = (FenObjSecDO) session.get(FenObjSecDO.class, (Serializable)objSeg.getId());
				list.add(objSecDO);
			}
			perfilDO.setObjetosSeg(list);
		}
		//
		
		session.saveOrUpdate(perfilDO);
		
		session.getTransaction().commit();
		
		return perfilDO.getId();
	}

	@SuppressWarnings("unchecked")
	public List<CenDefaultCObj> getList()
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		List<CenDefaultCObj> res = new ArrayList<CenDefaultCObj>();
		Criteria c = session.createCriteria(FenPerfilDO.class);
		List<CenDefaultDO> perfiles = c.list();
		
		for (CenDefaultDO cobj : perfiles) 
		{
			FenPerfilDO perfilDO = (FenPerfilDO) cobj;
			res.add(getCObj(perfilDO));
		}
		
		session.getTransaction().commit();
		return res;
	}
	
	private CenDefaultCObj getCObj(FenPerfilDO perfilDO)
	{
		FenPerfilCObj cObj = new FenPerfilCObj();
		cObj.setId(perfilDO.getId());
		cObj.setDescripcion(perfilDO.getDescripcion());
		cObj.setObjSecs(new ArrayList<FenObjSecCObj>());
		
		FenObjSecService servObj = new FenObjSecServiceImpl();
		List<FenObjSecDO> objSegs = perfilDO.getObjetosSeg();
		
		for (FenObjSecDO fenObjSecDO : objSegs) {
			cObj.getObjSecs().add(servObj.getCObj(fenObjSecDO));
		}
		return cObj;
	}

	public void delete(CenDefaultCObj rep)
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		CenDefaultDO re = (CenDefaultDO) session.load(FenPerfilDO.class, (String)rep.getId());
		session.delete(re);
		
		session.getTransaction().commit();
	}

	public List<CenDefaultCObj> getList(int startIndex, int pageSize) 
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		List<CenDefaultCObj> res = new ArrayList<CenDefaultCObj>();
		Criteria c = session.createCriteria(FenPerfilDO.class);
		c.setFirstResult(startIndex);
		c.setFetchSize(pageSize);
		List<CenDefaultDO> perfiles = c.list();
		
		for (CenDefaultDO cobj : perfiles) 
		{
			FenPerfilDO perfilDO = (FenPerfilDO) cobj;
			res.add(getCObj(perfilDO));
		}
		
		session.getTransaction().commit();
		return res;
	}

	public int getSize() 
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		int res = (Integer)session.createCriteria(FenPerfilDO.class).setProjection(Projections.rowCount()).uniqueResult();
		session.getTransaction().commit();
		return res;
	}
}
